Fachbereich Automatisierung & Informatik

OER AI Engineering

Modul Mobile Systeme & Telematik

Case Study Analytics Fahrsimulation

Prof. Dr. Fabian Transchel, Hochschule Harz, Oktober 2025


Zielsetzung

Dieses Notebook demonstriert einige (wesentliche) Aspekte der aus Fahrsimulator-Recordings zu ziehenden Insights:

  • Vorverarbeitung und Bereinigung der Rohdaten
  • Übersicht der aufgezeichneten Daten
    • Sensorik (Telematik)
    • Video
  • Deskriptive Analytics der Bewegungsdaten
    • Geschwindigkeit, Beschleunigen, Bremsen
  • Analyse Fahrverhalten
    • Manöver
    • Anomalien
    • Kontext

Der hier entwickelte Code stellt die Basis für ein Dash-Applet dar.


Übersicht der aufgezeichneten Daten¶

Der erste Schritt in der Analytics-Pipeline besteht darin, eine geeignete Aufzeichnung zu laden. Dies soll später über ein Drop-Down oder eine Auto-Update-Funktionalität ersetzt werden.

In [2]:
import pandas as pd
import numpy as np
import plotly.express as px
import plotly.graph_objects as go
from IPython.display import Video
import matplotlib.pyplot as plt
%config InteractiveShell.ast_node_interactivity = 'all'
In [3]:
trip_record_data = "recording_2024_04_06__14_15_33.csv"
trip_record_video = "2024-04-06 14-05-37-1-cropped.m4v"
In [4]:
data_raw_df = pd.read_csv(trip_record_data)
data_raw_df.sample(20)
Out[4]:
throttle brakes wheel_position car0_engine_rpm car0_velocity_vehicle car0_throttle_position lin_vel lin_acc rot_acc engine_rpm brakes_vol timestamp
9277 0 0 -0.0636173 0 0 0 0,0,0 0,0,0 0,0,0 0 1 93.7267
53830 0.17952 0 -0.0884358 2563.26 21.9749 0.27204 -21.557,-4.24762,-0.389017 0.0944575,-0.688819,-0.285934 -0.131926,-0.0481708,0.0149275 2563.26 1 539.255
12407 0.25014 0 1.92972 1278.74 3.05912 0.295849 -0.365724,-3.03717,-0.00941711 -0.735082,-0.892793,-0.0330398 0.356545,0.0725956,-0.225495 1278.74 1 125.026
51693 0.24288 0 -0.0367566 2532.44 21.6884 0.341171 -16.9473,-13.5342,-0.00733167 0.206931,-0.36176,-0.265037 0.187531,0.165401,-0.0677085 2532.44 1 517.884
51814 0.2475 0 0.019792 2541.95 21.7731 0.345514 -17.0678,-13.5189,0.00183881 -0.175563,0.0554826,0.0552165 -0.00484209,-0.0826061,-0.0261368 2541.95 1 519.095
39573 0.2508 0 0.233734 2519.08 21.5738 0.349844 20.2633,7.40176,0.203628 0.687402,-1.82326,-0.0371998 -0.0200353,0.148493,0.0358984 2519.08 1 396.691
865 0.00066 0 -0.109013 0 0 0 0,0,0 0,0,0 0,0,0 0 1 9.60735
23331 0.51084 0 -0.0510509 2577.28 16.9437 0.587866 -16.3869,4.29763,0.296727 -0.863221,-0.0692568,-0.0994931 -0.304286,0.194343,-0.0334947 2577.28 1 234.272
18873 0.03696 0 0.578053 1804.87 9.46191 0.0910357 -4.82482,-8.13934,-0.00452443 -0.819433,0.895605,0.120034 -0.0456593,-0.0526139,-0.208165 1804.87 1 189.686
17223 0.12012 0 0.155195 2012.89 10.5347 0.1825 -4.61638,-9.46932,-0.0238541 -0.265974,0.211472,-0.0902065 -0.0102596,0.225545,0.0174639 2012.89 1 173.191
1071 0 0 -0.109013 0 0 0 0,0,0 0,0,0 0,0,0 0 1 11.6652
30940 0 0 0.0529358 2546.04 21.7807 0.437712 -0.720917,21.7579,0.6866 0.435835,-0.0312516,0.0887895 0.0465505,-0.0841443,-0.00693473 2546.04 1 310.354
7462 0.00066 0 -0.0777544 0 0 0 0,0,0 0,0,0 0,0,0 0 1 75.5777
47000 0.20262 0 -0.216142 2491.64 21.3559 0.287955 8.79538,-19.4582,-0.308618 1.60893,0.680587,0.174575 0.169372,0.127591,0.0275848 2491.64 1 470.955
4841 0 0 -0.0777544 0 0 0 0,0,0 0,0,0 0,0,0 0 1 49.3725
19668 0.97812 0 -0.0622035 4376.04 16.9914 0.977416 -16.3185,4.73425,-0.0366465 -3.27074,0.644422,0.0449931 0.10964,-0.00069904,0.104384 4376.04 1 197.632
52983 0.22704 0 0.225881 2639.41 22.6115 0.324761 -22.3763,-3.25244,0.0215827 -0.242454,1.86899,0.0475645 -0.093916,-0.0283814,-0.0830453 2639.41 1 530.785
37987 0.13332 0 0.605856 2477.15 21.2384 0.225549 -7.11396,20.0113,0.0982858 4.7463,1.3071,0.226586 -0.328483,-0.3067,-0.00254746 2477.15 1 380.83
14608 0 0.099 -0.0504226 799.999 0.000334097 0.11558 -0.000106084,-0.000302088,9.54441e-05 0.0174632,0.0438298,0.0229139 -2.16721e-08,9.89869e-09,7.32748e-10 799.999 1 147.035
47953 0.26334 0 -0.130062 2649.29 22.6879 0.364889 22.6423,-1.43052,-0.135844 0.241461,1.48777,0.0590279 -0.510029,0.16675,-0.20707 2649.29 1 480.491
In [7]:
Video(trip_record_video,html_attributes="autoplay looped muted controls",width=900,embed=True)
Out[7]:
Your browser does not support the video tag.

In der Dash-App wollen wir den Time-Indicator mit anderen Elementen synchronisieren: z.B: einem Punkt auf der Karte und/oder Indikator-Linien in den Zeitreihen. Mal sehen, ob wir das können.


Vorverarbeitung¶

In diesem Abschnitt müssen die Daten in die richtige Reihenfolge und die richtigen Datentypen gebracht werden, Vektoren in einzelne Spalten aufgeteilt und die ganze Zeitreihe resampelt werden.

Spalten-Management¶

Zunächst müssen die Spalten sinnvoll benannt oder weggeworfen werden. Danach ziehen wir vektorwertige Spalten auseinander.

Bevor wir dies jedoch tun können müssen die ersten beiden Zeilen verworfen werden:

In [8]:
data_raw_df = data_raw_df.drop([0,1],axis=0)
data_raw_df.head()
Out[8]:
throttle brakes wheel_position car0_engine_rpm car0_velocity_vehicle car0_throttle_position lin_vel lin_acc rot_acc engine_rpm brakes_vol timestamp
2 0 0 -0.109327 0 0 0 0,0,0 0,0,0 0,0,0 0 1 0.978997
3 0.00066 0 -0.109327 0 0 0 0,0,0 0,0,0 0,0,0 0 1 0.993015
4 0.00066 0 -0.109327 0 0 0 0,0,0 0,0,0 0,0,0 0 1 0.993015
5 0.00066 0 -0.109327 0 0 0 0,0,0 0,0,0 0,0,0 0 1 1.00255
6 0 0 -0.109327 0 0 0 0,0,0 0,0,0 0,0,0 0 1 1.02348

Wir erzeugen einen Hilfs-DF:

In [9]:
data_intermediary_df = pd.DataFrame([data_raw_df['timestamp'].T,data_raw_df['throttle'].T,data_raw_df['brakes'].T,data_raw_df['car0_velocity_vehicle'].T,data_raw_df['engine_rpm'].T]).T
data_intermediary_df.columns = ["Zeit","Gas","Bremse","Geschwindigkeit","Motor-Drehzahl"]
data_intermediary_df['Zeit'] = pd.to_timedelta(data_intermediary_df['Zeit'].apply(lambda x:float(x)),unit='s')
data_intermediary_df["Geschwindigkeit"] = data_intermediary_df['Geschwindigkeit'].apply(lambda x:float(x)*3.6) # Geschwindigkeit von m/s zu kmh/h
data_intermediary_df["Gas"] = data_intermediary_df['Gas'].apply(lambda x:float(x)) # Typ zu Float casten
data_intermediary_df["Bremse"] = data_intermediary_df['Bremse'].apply(lambda x:float(x)) # Typ zu Float casten
data_intermediary_df["Motor-Drehzahl"] = data_intermediary_df['Motor-Drehzahl'].apply(lambda x:float(x)) # Typ zu Float casten
data_intermediary_df.dtypes
data_intermediary_df.head(10)
Out[9]:
Zeit               timedelta64[ns]
Gas                        float64
Bremse                     float64
Geschwindigkeit            float64
Motor-Drehzahl             float64
dtype: object
Out[9]:
Zeit Gas Bremse Geschwindigkeit Motor-Drehzahl
2 0 days 00:00:00.978997 0.00000 0.0 0.0 0.0
3 0 days 00:00:00.993015 0.00066 0.0 0.0 0.0
4 0 days 00:00:00.993015 0.00066 0.0 0.0 0.0
5 0 days 00:00:01.002550 0.00066 0.0 0.0 0.0
6 0 days 00:00:01.023480 0.00000 0.0 0.0 0.0
7 0 days 00:00:01.023480 0.00000 0.0 0.0 0.0
8 0 days 00:00:01.035430 0.00000 0.0 0.0 0.0
9 0 days 00:00:01.046400 0.00066 0.0 0.0 0.0
10 0 days 00:00:01.057350 0.00066 0.0 0.0 0.0
11 0 days 00:00:01.068330 0.00000 0.0 0.0 0.0

In diesen müssen wir noch einfügen: X-Y-Z-Beschleunigung und X-Y-Z-Rotationen:

In [10]:
accs = pd.DataFrame(data_raw_df['lin_acc'].apply(lambda x:x.split(',')).to_list(),columns=['ACC_X','ACC_Y','ACC_Z'])
accs.index = data_intermediary_df.index
rots = pd.DataFrame(data_raw_df['rot_acc'].apply(lambda x:x.split(',')).to_list(),columns=['ROT_X','ROT_Y','ROT_Z'])
rots.index = data_intermediary_df.index
data_intermediary_df = pd.concat([data_intermediary_df,accs,rots],axis=1)
# Datentypen ändern
data_intermediary_df["ACC_X"] = data_intermediary_df['ACC_X'].apply(lambda x:float(x)) # Typ zu Float casten
data_intermediary_df["ACC_Y"] = data_intermediary_df['ACC_Y'].apply(lambda x:float(x)) # Typ zu Float casten
data_intermediary_df["ACC_Z"] = data_intermediary_df['ACC_Z'].apply(lambda x:float(x)) # Typ zu Float casten
data_intermediary_df["ROT_X"] = data_intermediary_df['ROT_X'].apply(lambda x:float(x)) # Typ zu Float casten
data_intermediary_df["ROT_Y"] = data_intermediary_df['ROT_Y'].apply(lambda x:float(x)) # Typ zu Float casten
data_intermediary_df["ROT_Z"] = data_intermediary_df['ROT_Z'].apply(lambda x:float(x)) # Typ zu Float casten
data_intermediary_df
Out[10]:
Zeit Gas Bremse Geschwindigkeit Motor-Drehzahl ACC_X ACC_Y ACC_Z ROT_X ROT_Y ROT_Z
2 0 days 00:00:00.978997 0.00000 0.0 0.000000 0.000 0.00000 0.000000 0.00000 0.000000e+00 0.000000 0.000000e+00
3 0 days 00:00:00.993015 0.00066 0.0 0.000000 0.000 0.00000 0.000000 0.00000 0.000000e+00 0.000000 0.000000e+00
4 0 days 00:00:00.993015 0.00066 0.0 0.000000 0.000 0.00000 0.000000 0.00000 0.000000e+00 0.000000 0.000000e+00
5 0 days 00:00:01.002550 0.00066 0.0 0.000000 0.000 0.00000 0.000000 0.00000 0.000000e+00 0.000000 0.000000e+00
6 0 days 00:00:01.023480 0.00000 0.0 0.000000 0.000 0.00000 0.000000 0.00000 0.000000e+00 0.000000 0.000000e+00
... ... ... ... ... ... ... ... ... ... ... ...
59034 0 days 00:09:51.301000 0.00066 0.0 0.037971 799.999 0.01097 0.001676 -0.00003 -9.999200e-07 0.000003 3.210020e-08
59035 0 days 00:09:51.312000 0.00000 0.0 0.037971 799.999 0.01097 0.001676 -0.00003 -9.999200e-07 0.000003 3.210020e-08
59036 0 days 00:09:51.323000 0.00000 0.0 0.037971 799.999 0.01097 0.001676 -0.00003 -9.999200e-07 0.000003 3.210020e-08
59037 0 days 00:09:51.323000 0.00000 0.0 0.037971 799.999 0.01097 0.001676 -0.00003 -9.999200e-07 0.000003 3.210020e-08
59038 0 days 00:09:51.333000 0.00000 0.0 0.037971 799.999 0.01097 0.001676 -0.00003 -9.999200e-07 0.000003 3.210020e-08

59037 rows × 11 columns

Zum Schluss entfernen wir den Anfang der Aufzeichnung - wo die Motordrehzahl unter 800 liegt, ist die Simulation noch nicht gestartet.

In [11]:
data_filtered_df = data_intermediary_df[data_intermediary_df['Motor-Drehzahl']>= 750.0]
data_filtered_df.info()
data_filtered_df
print(data_filtered_df.memory_usage)
# Wir geben den Speicher für die Rohdaten wieder frei. Das könnte nämlich ganz schön viel sein.
del(data_intermediary_df,data_raw_df)
<class 'pandas.core.frame.DataFrame'>
Index: 48198 entries, 10837 to 59038
Data columns (total 11 columns):
 #   Column           Non-Null Count  Dtype          
---  ------           --------------  -----          
 0   Zeit             48198 non-null  timedelta64[ns]
 1   Gas              48198 non-null  float64        
 2   Bremse           48198 non-null  float64        
 3   Geschwindigkeit  48198 non-null  float64        
 4   Motor-Drehzahl   48198 non-null  float64        
 5   ACC_X            48198 non-null  float64        
 6   ACC_Y            48198 non-null  float64        
 7   ACC_Z            48198 non-null  float64        
 8   ROT_X            48198 non-null  float64        
 9   ROT_Y            48198 non-null  float64        
 10  ROT_Z            48198 non-null  float64        
dtypes: float64(10), timedelta64[ns](1)
memory usage: 4.4 MB
Out[11]:
Zeit Gas Bremse Geschwindigkeit Motor-Drehzahl ACC_X ACC_Y ACC_Z ROT_X ROT_Y ROT_Z
10837 0 days 00:01:49.329000 0.00066 0.0 0.319027 800.000 -0.000321 -0.000778 -8.42231 -3.611660e-03 -0.003409 -3.995850e-07
10838 0 days 00:01:49.339000 0.00066 0.0 0.615388 800.000 -0.002373 -0.005727 -6.80092 -4.949260e-02 -0.046701 -9.713210e-06
10839 0 days 00:01:49.351000 0.00066 0.0 0.863176 800.000 -0.006628 -0.016011 -5.75900 -9.347300e-02 -0.088031 -5.166300e-05
10840 0 days 00:01:49.363000 0.00000 0.0 1.050754 800.000 -0.008747 -0.021239 -4.80151 -1.477770e-01 -0.139063 -1.267140e-04
10841 0 days 00:01:49.363000 0.00000 0.0 1.050754 800.000 -0.008747 -0.021239 -4.80151 -1.477770e-01 -0.139063 -1.267140e-04
... ... ... ... ... ... ... ... ... ... ... ...
59034 0 days 00:09:51.301000 0.00066 0.0 0.037971 799.999 0.010970 0.001676 -0.00003 -9.999200e-07 0.000003 3.210020e-08
59035 0 days 00:09:51.312000 0.00000 0.0 0.037971 799.999 0.010970 0.001676 -0.00003 -9.999200e-07 0.000003 3.210020e-08
59036 0 days 00:09:51.323000 0.00000 0.0 0.037971 799.999 0.010970 0.001676 -0.00003 -9.999200e-07 0.000003 3.210020e-08
59037 0 days 00:09:51.323000 0.00000 0.0 0.037971 799.999 0.010970 0.001676 -0.00003 -9.999200e-07 0.000003 3.210020e-08
59038 0 days 00:09:51.333000 0.00000 0.0 0.037971 799.999 0.010970 0.001676 -0.00003 -9.999200e-07 0.000003 3.210020e-08

48198 rows × 11 columns

<bound method DataFrame.memory_usage of                         Zeit      Gas  Bremse  Geschwindigkeit  \
10837 0 days 00:01:49.329000  0.00066     0.0         0.319027   
10838 0 days 00:01:49.339000  0.00066     0.0         0.615388   
10839 0 days 00:01:49.351000  0.00066     0.0         0.863176   
10840 0 days 00:01:49.363000  0.00000     0.0         1.050754   
10841 0 days 00:01:49.363000  0.00000     0.0         1.050754   
...                      ...      ...     ...              ...   
59034 0 days 00:09:51.301000  0.00066     0.0         0.037971   
59035 0 days 00:09:51.312000  0.00000     0.0         0.037971   
59036 0 days 00:09:51.323000  0.00000     0.0         0.037971   
59037 0 days 00:09:51.323000  0.00000     0.0         0.037971   
59038 0 days 00:09:51.333000  0.00000     0.0         0.037971   

       Motor-Drehzahl     ACC_X     ACC_Y    ACC_Z         ROT_X     ROT_Y  \
10837         800.000 -0.000321 -0.000778 -8.42231 -3.611660e-03 -0.003409   
10838         800.000 -0.002373 -0.005727 -6.80092 -4.949260e-02 -0.046701   
10839         800.000 -0.006628 -0.016011 -5.75900 -9.347300e-02 -0.088031   
10840         800.000 -0.008747 -0.021239 -4.80151 -1.477770e-01 -0.139063   
10841         800.000 -0.008747 -0.021239 -4.80151 -1.477770e-01 -0.139063   
...               ...       ...       ...      ...           ...       ...   
59034         799.999  0.010970  0.001676 -0.00003 -9.999200e-07  0.000003   
59035         799.999  0.010970  0.001676 -0.00003 -9.999200e-07  0.000003   
59036         799.999  0.010970  0.001676 -0.00003 -9.999200e-07  0.000003   
59037         799.999  0.010970  0.001676 -0.00003 -9.999200e-07  0.000003   
59038         799.999  0.010970  0.001676 -0.00003 -9.999200e-07  0.000003   

              ROT_Z  
10837 -3.995850e-07  
10838 -9.713210e-06  
10839 -5.166300e-05  
10840 -1.267140e-04  
10841 -1.267140e-04  
...             ...  
59034  3.210020e-08  
59035  3.210020e-08  
59036  3.210020e-08  
59037  3.210020e-08  
59038  3.210020e-08  

[48198 rows x 11 columns]>

Resampling¶

Die ganze Zeitreihe ist bereits synchronisiert. Allerdings ist die Zeitbasis nach Maßgabe des Replikators nicht perfekt äquidistant. Das wollen wir anpassen.

In [12]:
#td = -data_filtered_df['Zeit'].iloc[0]
data_filtered_resampled_df = data_filtered_df.copy()
data_filtered_resampled_df.index = data_filtered_df['Zeit']
data_filtered_resampled_df = data_filtered_resampled_df.resample('10ms',origin='start').mean()
data_filtered_resampled_df
Out[12]:
Zeit Gas Bremse Geschwindigkeit Motor-Drehzahl ACC_X ACC_Y ACC_Z ROT_X ROT_Y ROT_Z
Zeit
0 days 00:01:49.329000 0 days 00:01:49.329000 0.00066 0.0 0.319027 800.000 -0.000321 -0.000778 -8.42231 -3.611660e-03 -0.003409 -3.995850e-07
0 days 00:01:49.339000 0 days 00:01:49.339000 0.00066 0.0 0.615388 800.000 -0.002373 -0.005727 -6.80092 -4.949260e-02 -0.046701 -9.713210e-06
0 days 00:01:49.349000 0 days 00:01:49.351000 0.00066 0.0 0.863176 800.000 -0.006628 -0.016011 -5.75900 -9.347300e-02 -0.088031 -5.166300e-05
0 days 00:01:49.359000 0 days 00:01:49.363000 0.00000 0.0 1.050754 800.000 -0.008747 -0.021239 -4.80151 -1.477770e-01 -0.139063 -1.267140e-04
0 days 00:01:49.369000 NaT NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
... ... ... ... ... ... ... ... ... ... ... ...
0 days 00:09:51.289000 0 days 00:09:51.290000 0.00066 0.0 0.037971 799.999 0.010970 0.001676 -0.00003 -9.999200e-07 0.000003 3.210020e-08
0 days 00:09:51.299000 0 days 00:09:51.301000 0.00066 0.0 0.037971 799.999 0.010970 0.001676 -0.00003 -9.999200e-07 0.000003 3.210020e-08
0 days 00:09:51.309000 0 days 00:09:51.312000 0.00000 0.0 0.037971 799.999 0.010970 0.001676 -0.00003 -9.999200e-07 0.000003 3.210020e-08
0 days 00:09:51.319000 0 days 00:09:51.323000 0.00000 0.0 0.037971 799.999 0.010970 0.001676 -0.00003 -9.999200e-07 0.000003 3.210020e-08
0 days 00:09:51.329000 0 days 00:09:51.333000 0.00000 0.0 0.037971 799.999 0.010970 0.001676 -0.00003 -9.999200e-07 0.000003 3.210020e-08

48201 rows × 11 columns


Exploration¶

In [13]:
px.scatter(data_filtered_resampled_df,"Zeit","Geschwindigkeit",color="Geschwindigkeit")
px.scatter(data_filtered_resampled_df,"Zeit","Gas",color="Gas")
px.scatter(data_filtered_resampled_df,"Zeit","Bremse",color="Bremse")
px.scatter(data_filtered_resampled_df,"Zeit","Motor-Drehzahl",color="Motor-Drehzahl")
In [14]:
%config InteractiveShell.ast_node_interactivity = 'last_expr'
colors = ['red','green','blue']
fig = go.Figure()
i = 0
for plot in ['ACC_X', 'ACC_Y', 'ACC_Z']:
    fig.add_trace(go.Line(x=data_filtered_df["Zeit"], y=data_filtered_df[plot], name=plot))#,color=colors[i]))
    i+=1
fig.show()
d:\Anaconda\envs\HSH_ML\Lib\site-packages\plotly\graph_objs\_deprecations.py:378: DeprecationWarning:

plotly.graph_objs.Line is deprecated.
Please replace it with one of the following more specific types
  - plotly.graph_objs.scatter.Line
  - plotly.graph_objs.layout.shape.Line
  - etc.


In [15]:
%config InteractiveShell.ast_node_interactivity = 'last_expr'
colors = ['red','green','blue']
fig = go.Figure()
i = 0
for plot in ['ROT_X', 'ROT_Y', 'ROT_Z']:
    fig.add_trace(go.Line(x=data_filtered_df["Zeit"], y=data_filtered_df[plot], name=plot))#,color=colors[i]))
    i+=1
fig.show()

Analytics¶

Manövererkennung¶

Zur Vorbereitung der eigentlichen Analytics soll zunächst die Übersicht über die vorhandenen Merkmale weiter vertieft werden. Jenseits von fortgeschrittenen Zerlegungen der Daten (z.B: Windowing, s.u.) wird hier vorgeschlagen, auf Basis von Schwellwerten erste Eindrücke zu zeitlich beschränkten Untergruppen von Beobachtungen ("Manöver") zu sammeln.

In [16]:
thresh_spd = 0.75
ueberschreitung_spd = data_filtered_df[data_filtered_df['Geschwindigkeit'].pct_change() > thresh_spd]
thresh_acc = 1.5
ueberschreitung_acc = data_filtered_df[data_filtered_df['ACC_Y'].pct_change() > thresh_spd]
In [17]:
fig = go.Figure()
fig.add_trace(go.Line(x=data_filtered_df["Zeit"], y=data_filtered_df['ACC_Y'], name=plot))
fig.add_trace(go.Scatter(x=data_filtered_df.loc[ueberschreitung_spd.index]['Zeit'],y=ueberschreitung_spd['ACC_Y'],mode='markers',marker_size=12,marker_line=dict(width=10, color='red')))
In [18]:
fig = go.Figure()
fig.add_trace(go.Line(x=data_filtered_df["Zeit"], y=data_filtered_df['Geschwindigkeit'], name=plot))
fig.add_trace(go.Scatter(x=data_filtered_df.loc[ueberschreitung_spd.index]['Zeit'],y=ueberschreitung_spd['Geschwindigkeit'],mode='markers',marker_size=12,marker_line=dict(width=10, color='red')))
In [21]:
# Aggregatorfunktionen definieren
agg_functions = {
    'Gas': ['mean', 'max', 'std'],
    'Bremse': ['mean', 'max', 'std'],
    'Geschwindigkeit': ['mean', 'max', 'min', 'std'],
    'Motor-Drehzahl': ['mean', 'max', 'min', 'std'],
    'ACC_X': ['mean', 'max', 'min', 'std'],
    'ACC_Y': ['mean', 'max', 'min', 'std'],
    'ACC_Z': ['mean', 'max', 'min', 'std'],
    'ROT_X': ['mean', 'max', 'min', 'std'],
    'ROT_Y': ['mean', 'max', 'min', 'std'],
    'ROT_Z': ['mean', 'max', 'min', 'std']
}

# In 10s-Fenster aggregieren
df_aggregated_10s_windows = data_filtered_resampled_df.resample('10s').agg(agg_functions)

# Spaltennamen setzen
df_aggregated_10s_windows.columns = ['_'.join(col).strip() for col in df_aggregated_10s_windows.columns.values]

df_aggregated_10s_windows
Out[21]:
Gas_mean Gas_max Gas_std Bremse_mean Bremse_max Bremse_std Geschwindigkeit_mean Geschwindigkeit_max Geschwindigkeit_min Geschwindigkeit_std ... ROT_X_min ROT_X_std ROT_Y_mean ROT_Y_max ROT_Y_min ROT_Y_std ROT_Z_mean ROT_Z_max ROT_Z_min ROT_Z_std
Zeit
0 days 00:01:49.329000 0.000506 0.01914 0.001528 0.000000 0.0000 0.000000 0.058123 1.815242 0.000831 0.223772 ... -1.477770e-01 0.034666 0.000383 0.164040 -0.139063 0.014655 -3.305522e-06 6.419350e-03 -1.500570e-02 5.978229e-04
0 days 00:01:59.329000 0.208605 0.26994 0.080343 0.000000 0.0000 0.000000 8.521769 17.578332 0.000847 5.493726 ... -3.373920e+00 0.362636 0.000672 1.855450 -1.158240 0.252847 1.750182e-04 2.675360e-01 -3.611390e-01 1.047819e-01
0 days 00:02:09.329000 0.125289 0.27192 0.110667 0.000000 0.0000 0.000000 21.819851 24.966018 17.631684 2.114968 ... -1.161910e+00 0.375188 0.001865 1.628840 -1.526200 0.403031 -1.412689e-03 2.159370e-01 -1.817690e-01 4.427175e-02
0 days 00:02:19.329000 0.000215 0.00132 0.000387 0.024296 0.1080 0.033831 8.302158 18.656100 0.001203 6.588066 ... -8.874350e-01 0.229745 0.000294 0.810219 -1.416440 0.240169 2.821363e-04 1.137770e-01 -1.800940e-01 2.533703e-02
0 days 00:02:29.329000 0.252731 0.51942 0.240457 0.000000 0.0000 0.000000 8.791796 29.076300 0.006362 10.859146 ... -2.831550e+00 0.343954 -0.000958 2.891960 -5.065570 0.435415 -5.085991e-03 3.087310e-01 -4.826270e-01 4.649287e-02
0 days 00:02:39.329000 0.217077 0.57486 0.170535 0.000000 0.0000 0.000000 34.836600 40.474800 28.883340 4.312702 ... -3.686510e-01 0.133763 -0.000041 0.538035 -0.483779 0.155401 4.068384e-03 9.958090e-02 -1.461130e-01 4.311746e-02
0 days 00:02:49.329000 0.120049 0.12408 0.001760 0.000000 0.0000 0.000000 37.559527 38.752920 36.510840 0.763382 ... -3.735660e-01 0.115088 -0.001146 0.462122 -0.464019 0.138935 1.800819e-04 8.609740e-02 -7.804530e-02 2.517562e-02
0 days 00:02:59.329000 0.099993 0.14718 0.055832 0.000000 0.0000 0.000000 36.292785 37.874880 33.978060 1.085065 ... -1.579525e+00 0.247715 -0.002448 0.709035 -1.085770 0.208872 -7.547927e-04 6.459400e-02 -1.635780e-01 2.329031e-02
0 days 00:03:09.329000 0.547542 0.98208 0.381095 0.000000 0.0000 0.000000 42.761836 76.160520 29.900196 14.230196 ... -5.211660e-01 0.175979 -0.000233 0.829429 -0.910324 0.219892 5.654605e-03 6.804720e-01 -4.939985e-01 1.878179e-01
0 days 00:03:19.329000 0.126245 0.98208 0.205760 0.000000 0.0000 0.000000 70.785103 80.129880 66.480120 4.510568 ... -4.453970e-01 0.157041 0.000271 0.764158 -0.447168 0.132742 -1.328454e-03 2.299520e-01 -2.165420e-01 5.361775e-02
0 days 00:03:29.329000 0.217435 0.21846 0.000919 0.000000 0.0000 0.000000 68.518695 69.517080 67.020480 0.742249 ... -6.016070e-01 0.158251 -0.001960 0.335822 -0.395349 0.114524 1.737358e-04 5.924610e-02 -9.784150e-02 2.063487e-02
0 days 00:03:39.329000 0.230017 0.23892 0.005332 0.000000 0.0000 0.000000 65.767527 69.013440 60.244200 2.732331 ... -5.207330e-01 0.172694 -0.000916 0.635849 -0.507574 0.162644 -1.556235e-03 1.221310e-01 -1.291770e-01 3.343562e-02
0 days 00:03:49.329000 0.327334 0.51150 0.165715 0.000000 0.0000 0.000000 62.963698 70.523280 57.880080 4.660941 ... -5.789260e-01 0.164575 0.000216 0.581243 -0.460138 0.139849 -1.017687e-04 1.524440e-01 -1.358400e-01 3.149815e-02
0 days 00:03:59.329000 0.082645 0.16962 0.063567 0.000000 0.0000 0.000000 58.345921 67.259880 54.504000 3.651921 ... -5.318040e-01 0.151475 0.001201 0.401153 -0.491929 0.127996 -8.737784e-04 7.984760e-02 -1.217630e-01 2.378285e-02
0 days 00:04:09.329000 0.424137 1.00000 0.356318 0.000000 0.0000 0.000000 74.181804 80.786880 54.503640 8.794913 ... -6.195590e-01 0.154827 -0.002645 0.660703 -0.545966 0.151512 2.686311e-04 1.382700e-01 -1.533830e-01 3.495155e-02
0 days 00:04:19.329000 0.130214 0.39204 0.171679 0.004198 0.0855 0.016469 80.574947 89.870760 73.726560 5.218082 ... -4.310000e-01 0.143490 0.000832 0.491735 -0.490370 0.143765 2.041876e-03 2.079670e-01 -1.721840e-01 4.156772e-02
0 days 00:04:29.329000 0.092845 0.24288 0.106671 0.003284 0.0585 0.012751 80.855574 87.156720 77.228640 3.614935 ... -4.010000e-01 0.146044 -0.002061 0.494039 -0.480752 0.158342 -1.577359e-02 3.162770e-01 -4.807070e-01 9.795390e-02
0 days 00:04:39.329000 0.056629 0.24288 0.097437 0.010969 0.1260 0.031075 81.909267 90.768600 77.882760 4.029983 ... -6.769340e-01 0.195331 -0.000959 0.686773 -0.937826 0.210864 1.718315e-02 3.583100e-01 -3.430390e-01 1.017560e-01
0 days 00:04:49.329000 0.036611 0.16500 0.061499 0.000000 0.0000 0.000000 78.379081 78.806520 77.724000 0.339931 ... -5.917790e-01 0.182454 -0.000441 0.639941 -0.664979 0.193849 -1.758759e-03 1.368700e-01 -1.185050e-01 3.486576e-02
0 days 00:04:59.329000 0.000428 0.00132 0.000528 0.000000 0.0000 0.000000 78.387667 78.480000 78.320880 0.035188 ... -6.163010e-01 0.176719 -0.002578 0.642461 -0.560736 0.212006 -2.671941e-03 1.747040e-01 -1.074310e-01 4.159803e-02
0 days 00:05:09.329000 0.000348 0.00132 0.000492 0.002502 0.0315 0.007347 78.419958 78.744240 76.839480 0.482104 ... -6.471820e-01 0.171627 0.002387 0.406517 -0.450265 0.137713 1.796412e-03 2.302780e-01 -2.145960e-01 5.194902e-02
0 days 00:05:19.329000 0.040934 0.17160 0.061807 0.000000 0.0000 0.000000 73.627091 79.886160 66.783600 4.835778 ... -5.651650e-01 0.173811 -0.000369 0.397304 -0.441318 0.119448 3.154848e-03 2.175390e-01 -2.439440e-01 7.072325e-02
0 days 00:05:29.329000 0.068416 0.24024 0.085538 0.000000 0.0000 0.000000 62.668010 66.777480 55.135440 3.550138 ... -5.149270e-01 0.164254 0.000647 0.301055 -0.317678 0.102035 -2.328199e-03 8.373930e-02 -9.210710e-02 2.601702e-02
0 days 00:05:39.329000 0.393428 0.97878 0.358581 0.000000 0.0000 0.000000 66.450390 79.575120 54.290160 10.370126 ... -5.263290e-01 0.170781 0.000967 0.869502 -0.693837 0.154231 -2.622263e-04 1.546350e-01 -1.394370e-01 3.626302e-02
0 days 00:05:49.329000 0.000200 0.00132 0.000308 0.000000 0.0000 0.000000 77.758151 81.446400 75.697920 1.927382 ... -5.000520e-01 0.166700 -0.001982 0.445646 -0.639734 0.148266 -4.906667e-04 1.087350e-01 -1.866760e-01 2.973705e-02
0 days 00:05:59.329000 0.146562 0.35112 0.141342 0.000000 0.0000 0.000000 63.492205 78.147720 52.643520 7.217409 ... -1.056870e+00 0.197761 -0.006576 2.300970 -1.319930 0.345579 1.092288e-02 8.684460e-01 -3.773460e-01 8.194280e-02
0 days 00:06:09.329000 0.152615 0.33528 0.140236 0.000000 0.0000 0.000000 75.500089 80.827200 68.545080 3.842063 ... -3.628320e-01 0.127261 -0.001363 0.579120 -0.695798 0.192171 -3.258202e-02 2.939930e-01 -5.072760e-01 1.225103e-01
0 days 00:06:19.329000 0.217470 0.32010 0.132235 0.000000 0.0000 0.000000 78.050432 80.392320 76.224960 1.276147 ... -5.092280e-01 0.175211 0.003246 0.543292 -0.748922 0.172458 1.232880e-02 3.762570e-01 -2.833970e-01 9.897311e-02
0 days 00:06:29.329000 0.179410 0.28248 0.095674 0.000000 0.0000 0.000000 77.207596 78.651720 70.814520 1.704265 ... -5.973890e-01 0.148031 -0.000491 0.578027 -0.658184 0.177734 7.623762e-03 2.581110e-01 -1.342470e-01 4.628471e-02
0 days 00:06:39.329000 0.199975 0.30756 0.088940 0.000000 0.0000 0.000000 68.458966 70.749720 67.184280 0.830155 ... -4.643060e-01 0.166128 -0.001223 0.449009 -0.417210 0.116911 2.085045e-03 1.758710e-01 -1.122530e-01 2.960896e-02
0 days 00:06:49.329000 0.182213 0.50622 0.117840 0.000000 0.0000 0.000000 66.435129 69.602040 65.223360 1.270466 ... -5.819160e-01 0.159069 -0.000696 0.319363 -0.565635 0.102259 -1.241910e-03 1.061180e-01 -1.208980e-01 2.352376e-02
0 days 00:06:59.329000 0.369300 0.99990 0.253809 0.000000 0.0000 0.000000 78.146375 79.893720 67.820760 2.994963 ... -4.667460e-01 0.160578 -0.001193 0.845639 -0.992593 0.161278 1.072808e-03 1.784490e-01 -1.255050e-01 3.795998e-02
0 days 00:07:09.329000 0.313007 0.45210 0.136715 0.000000 0.0000 0.000000 81.892958 85.968180 79.260120 2.439023 ... -5.928380e-01 0.152100 0.003749 0.579324 -0.751056 0.169001 -5.066436e-03 4.030600e-01 -3.383090e-01 9.728039e-02
0 days 00:07:19.329000 0.181863 0.36498 0.151873 0.004701 0.0765 0.016395 76.722314 83.027880 68.137920 5.218989 ... -6.147030e-01 0.177086 -0.000136 0.555827 -0.601051 0.178948 -1.675380e-02 4.222330e-01 -4.752510e-01 1.181766e-01
0 days 00:07:29.329000 0.351170 0.58938 0.161771 0.000000 0.0000 0.000000 75.287984 81.046440 68.151420 4.970823 ... -5.212270e-01 0.177011 0.000683 0.661753 -0.604209 0.209581 2.163986e-02 3.812300e-01 -4.324290e-01 1.032560e-01
0 days 00:07:39.329000 0.166289 0.29634 0.132128 0.000000 0.0000 0.000000 80.097077 83.338200 76.879800 1.900536 ... -4.525570e-01 0.159563 -0.000702 0.453317 -0.555055 0.143262 9.540973e-03 2.828720e-01 -1.145760e-01 5.190574e-02
0 days 00:07:49.329000 0.224906 0.34056 0.112453 0.000000 0.0000 0.000000 79.944997 81.953640 76.868640 1.646941 ... -4.306410e-01 0.136189 0.000381 0.478050 -0.464282 0.155034 -1.669553e-03 2.456000e-01 -3.382470e-01 7.633063e-02
0 days 00:07:59.329000 0.148678 0.41316 0.149032 0.000000 0.0000 0.000000 78.487999 82.818360 73.118880 3.492033 ... -5.100290e-01 0.177071 0.001592 0.654264 -0.495192 0.142240 -3.655378e-02 2.944200e-01 -3.280470e-01 8.641468e-02
0 days 00:08:09.329000 0.270507 0.42240 0.136177 0.000000 0.0000 0.000000 81.248998 83.782800 75.302280 2.398232 ... -7.932030e-01 0.177503 0.001460 0.460007 -0.509316 0.136637 2.686511e-02 4.621870e-01 -2.639340e-01 8.885735e-02
0 days 00:08:19.329000 0.175429 0.30624 0.083116 0.000000 0.0000 0.000000 81.362824 83.402640 77.731200 1.592736 ... -4.906950e-01 0.150015 -0.000900 0.498683 -0.472530 0.145548 -8.393844e-03 2.475460e-01 -2.019540e-01 5.913546e-02
0 days 00:08:29.329000 0.222341 0.33594 0.045529 0.000000 0.0000 0.000000 77.310993 78.508080 76.381920 0.614130 ... -3.205620e-01 0.096009 -0.001279 0.475338 -0.520763 0.158672 8.511465e-03 2.461260e-01 -1.448060e-01 5.126176e-02
0 days 00:08:39.329000 0.283727 0.36696 0.091029 0.000000 0.0000 0.000000 80.860449 82.224360 78.519240 0.907262 ... -3.645420e-01 0.127076 0.002205 0.547065 -0.418369 0.153262 -3.701383e-03 3.899250e-01 -4.555220e-01 9.328230e-02
0 days 00:08:49.329000 0.158954 0.30492 0.111950 0.000000 0.0000 0.000000 79.340533 81.576000 76.090320 1.883670 ... -5.648670e-01 0.190460 0.000069 1.050570 -1.002230 0.250781 7.457623e-03 4.013190e-01 -3.976570e-01 1.190876e-01
0 days 00:08:59.329000 0.179262 0.26664 0.077976 0.000000 0.0000 0.000000 77.379933 79.251840 76.190760 1.153322 ... -5.636470e-01 0.160095 0.000004 0.533922 -0.470357 0.143539 -2.198893e-03 1.921640e-01 -2.646055e-01 5.054415e-02
0 days 00:09:09.329000 0.187363 0.46662 0.168494 0.000000 0.0000 0.000000 73.697140 78.163200 69.978600 2.606776 ... -6.177550e-01 0.183227 0.002448 1.084370 -1.126880 0.219920 -1.902260e-02 2.185100e-01 -3.222780e-01 6.760990e-02
0 days 00:09:19.329000 0.375809 0.59598 0.128827 0.000000 0.0000 0.000000 78.785098 81.410760 74.850120 1.611900 ... -4.640310e-01 0.148034 -0.002251 0.711573 -0.849883 0.195916 3.423008e-02 4.231720e-01 -3.476170e-01 1.161751e-01
0 days 00:09:29.329000 0.002153 0.26730 0.019119 0.083915 0.4095 0.115299 38.059899 80.078760 0.006047 30.711351 ... -6.532480e-01 0.158680 -0.002049 0.486957 -0.600457 0.150773 -1.656756e-02 4.135890e-01 -7.284430e-01 1.044126e-01
0 days 00:09:39.329000 0.000384 0.00198 0.000541 0.000000 0.0000 0.000000 0.038034 0.038238 0.037970 0.000063 ... -3.239920e-05 0.000002 0.000001 0.000009 -0.000009 0.000003 2.176028e-08 3.976500e-06 -1.852590e-05 7.578669e-07
0 days 00:09:49.329000 0.000383 0.00198 0.000554 0.000000 0.0000 0.000000 0.037971 0.037971 0.037971 0.000000 ... -9.999200e-07 0.000000 0.000003 0.000003 0.000003 0.000000 3.210020e-08 3.210020e-08 3.210020e-08 0.000000e+00

49 rows × 38 columns


Übungsvorschläge

  • Prüfen Sie, inwieweit Schwellwertüberschreitungen ein geeignetes Selektionskriterium für die automatisierte Bewertung von Autofahrten darstellen können.
  • Inwieweit stellt es ein Problem dar, dass Manöver in überlappenden Windows liegen können?
  • Implementieren Sie eine Manövererkennung auf Basis von https://github.com/Schuster-j/maneuverRecognition/.
    • Erstellen Sie eine Route im Fahrsimulator, die geeignet ist, alle denkbaren manöver sinnvoll abzubilden.
    • Taggen Sie Windows der Daten mit Labels, die den späteren Zielklassen entsprechen.
    • Führen Sie eine geeignete Merkmalsextraktion auf Basis der Windows durch.
    • Trainieren Sie ein neuronales Netz, ein XGBoost und eine logistische Regression auf Basis der gewählten Aggregat-Features.
    • Bewerten Sie, ob das Ziel erreicht wurde und ob eine Manövererkennung auf Basis des Modells auch in der Realität möglich wäre.